
///////////////////////////////////////////////////////////////////////////////
//
//  Copyright (c) 2004, Perry L. Miller IV
//  All rights reserved.
//  BSD License: http://www.opensource.org/licenses/bsd-license.html
//
///////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////
///
///  Encapsulates numerical limits for NURBS.
///
///////////////////////////////////////////////////////////////////////////////

#ifndef _GENERIC_NURBS_LIBRARY_NURBS_LIMITS_CLASS_H_
#define _GENERIC_NURBS_LIBRARY_NURBS_LIMITS_CLASS_H_


namespace GN {
namespace Limits {


template < class T > struct Nurbs
{
  /////////////////////////////////////////////////////////////////////////////
  ///
  ///  Constants.
  ///
  /////////////////////////////////////////////////////////////////////////////

  enum
  {
    MIN_NUM_INDEP_VARS  = 1, // Minimum number of independent variables.
    MIN_NUM_DIMENSIONS  = 1, // Minimum number of dimensions.
    MIN_ORDER           = 2, // Minimum order.
    MIN_DEGREE          = 1, // Minimum degree.
    MIN_NUM_CTR_PTS     = 2, // Minimum number of control points.
    MIN_NUM_KNOTS       = 4, // Minimum number of knots.
  };


  /////////////////////////////////////////////////////////////////////////////
  ///
  ///  Get the minimum number of dependent variables.
  ///
  /////////////////////////////////////////////////////////////////////////////

  static T minNumDepVars ( bool rational )
  {
    return ( rational ) ? 2 : 1;
  }


  /////////////////////////////////////////////////////////////////////////////
  ///
  ///  Get the minimum number of control points allowed with the given order.
  ///
  /////////////////////////////////////////////////////////////////////////////

  static T minNumCtrPts ( T order )
  {
    return order;
  }


  /////////////////////////////////////////////////////////////////////////////
  ///
  ///  Get the maximum order allowed with the given number of control points.
  ///
  /////////////////////////////////////////////////////////////////////////////

  static T maxOrder ( T numControlPoints )
  {
    return numControlPoints;
  }
};


}; // namespace Nurbs
}; // namespace GN


#endif // _GENERIC_NURBS_LIBRARY_NURBS_LIMITS_CLASS_H_
